/**
 * 菜单数据访问层
 * 处理菜单相关的数据库操作
 */
const db = uniCloud.database();

class MenuDao {
  constructor() {
    this.menuCollection = db.collection('menu');
  }

  /**
   * 获取所有启用状态的菜单列表
   * @returns {Promise<Array>} 菜单列表
   */
  async getActiveMenus() {
    try {
      const { data } = await this.menuCollection
        .where({
          status: 1
        })
        .orderBy('sort_order', 'asc')
        .get();
      return data;
    } catch (error) {
      console.error('获取菜单列表失败:', error);
      throw error;
    }
  }

  /**
   * 根据ID获取菜单信息
   * @param {string} menuId - 菜单ID
   * @returns {Promise<Object|null>} 菜单信息
   */
  async getMenuById(menuId) {
    try {
      const { data } = await this.menuCollection.doc(menuId).get();
      return data;
    } catch (error) {
      console.error('获取菜单信息失败:', error);
      throw error;
    }
  }

  /**
   * 创建新菜单
   * @param {Object} menuData - 菜单数据
   * @returns {Promise<Object>} 创建结果
   */
  async createMenu(menuData) {
    try {
      const result = await this.menuCollection.add({
        data: {
          ...menuData,
          create_time: this.db.serverDate(),
          update_time: this.db.serverDate()
        }
      });
      return result;
    } catch (error) {
      console.error('创建菜单失败:', error);
      throw error;
    }
  }

  /**
   * 更新菜单信息
   * @param {string} menuId - 菜单ID
   * @param {Object} menuData - 菜单数据
   * @returns {Promise<Object>} 更新结果
   */
  async updateMenu(menuId, menuData) {
    try {
      const result = await this.menuCollection.doc(menuId).update({
        data: {
          ...menuData,
          update_time: this.db.serverDate()
        }
      });
      return result;
    } catch (error) {
      console.error('更新菜单失败:', error);
      throw error;
    }
  }

  /**
   * 删除菜单
   * @param {string} menuId - 菜单ID
   * @returns {Promise<Object>} 删除结果
   */
  async deleteMenu(menuId) {
    try {
      const result = await this.menuCollection.doc(menuId).remove();
      return result;
    } catch (error) {
      console.error('删除菜单失败:', error);
      throw error;
    }
  }

  /**
   * 批量更新菜单状态
   * @param {Array<string>} menuIds - 菜单ID数组
   * @param {number} status - 状态值（1启用，0禁用）
   * @returns {Promise<Object>} 更新结果
   */
  async batchUpdateStatus(menuIds, status) {
    try {
      const result = await menuCollection
        .where({
          _id: db.command.in(menuIds)
        })
        .update({
          data: {
            status,
            update_time: db.serverDate()
          }
        });
      return result;
    } catch (error) {
      console.error('批量更新菜单状态失败:', error);
      throw error;
    }
  }
}

module.exports = MenuDao;